package monster.flight.admin.manager.imp.xtgl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import monster.comm.key.Key;
import monster.comm.log.ILog;
import monster.comm.log.LogService;
import monster.comm.util.MyBatisBatchInsertSupport;
import monster.comm.util.Tool;
import monster.flight.admin.manager.service.xtgl.UsersService;
import monster.flight.admin.vo.xtgl.Xt_usersVO;
import monster.flight.comm.entity.dao.His_emp_roleDAO;
import monster.flight.comm.entity.dao.Xt_roleDAO;
import monster.flight.comm.entity.dao.Xt_usersDAO;
import monster.flight.comm.entity.vo.His_emp_role;
import monster.flight.comm.entity.vo.Xt_role;
import monster.flight.comm.entity.vo.Xt_users;
import monster.flight.comm.util.KeyConstant;

/**
 * 
* 创建信息=============
* 类名: monster.flight.admin.manager.imp.xtgl.UsersServiceImp
* 类作用描述: 此类包含登录检验、xt_user增删改查 、用户角色等注册用户信息服务
* 创建人： Administrator 
* 创建时间： 2013-1-10 上午12:28:57
* 修改信息1=============
* 修改类型:     //1.修改bug 2.业务变化修改
* 修改描述: 
* 修改人：  
* 修改时间：
 */
public class UsersServiceImp implements UsersService {
	private static ILog log = LogService.getLog(UsersServiceImp.class);
	private Xt_usersDAO xt_usersDAO;//用户信息dao	
	private His_emp_roleDAO his_emp_roleDAO;//人员角色表
	private MyBatisBatchInsertSupport insertSupport;
    private Xt_roleDAO xt_roleDAO;
	public Xt_roleDAO getXt_roleDAO() {
		return xt_roleDAO;
	}

	public void setXt_roleDAO(Xt_roleDAO xt_roleDAO) {
		this.xt_roleDAO = xt_roleDAO;
	}

	public MyBatisBatchInsertSupport getInsertSupport() {
		return insertSupport;
	}

	public void setInsertSupport(MyBatisBatchInsertSupport insertSupport) {
		this.insertSupport = insertSupport;
	}
	public Xt_usersDAO getXt_usersDAO() {
		return xt_usersDAO;
	}
	public void setXt_usersDAO(Xt_usersDAO xt_usersDAO) {
		this.xt_usersDAO = xt_usersDAO;
	}
    
	
	
	public His_emp_roleDAO getHis_emp_roleDAO() {
		return his_emp_roleDAO;
	}
	public void setHis_emp_roleDAO(His_emp_roleDAO his_emp_roleDAO) {
		this.his_emp_roleDAO = his_emp_roleDAO;
	}
	public Xt_users login(Xt_users po) throws Exception{
		Tool.NullException(po, "po为不能为null");
		Tool.NullException(po.getLogin_name(), "登录名不能为空");
		Tool.NullException(po.getLogin_psw(), "密码不能为空");
		return xt_usersDAO.login(po);
	}
	@Override
	public int checkUser(String loginName) throws Exception {
		Tool.NullException(loginName, "登录名不能为空");
		return xt_usersDAO.checkUser(loginName);
	}
	@Override
	public int login_chechUser(String loginName) throws Exception {
		Tool.NullException(loginName, "登录名不能为空");
		return xt_usersDAO.login_chechUser(loginName);
	}
	 /**
	   * @Description: 得到登录用户列表 带分页
	   * @return list<xt_users>
	   * @throws Exception
	   */
	public List<Xt_users> selectPage(Map<String, Object> map) throws Exception {
		Tool.NullException(map, "map不能为null");
		//Tool.NullException(map.get("condition"), "condition不能为null");
		Tool.NullException(map.get("order"), "order不能为null");
		List<Xt_users> list = new ArrayList<Xt_users>();
		list = xt_usersDAO.selectPage(map);
		return list;
	}
	 /**
	   * @Description: 添加登录用户数据
	   * @param po
	   * @throws Exception
	   */
	public void insert(Xt_usersVO po) throws Exception {
		Tool.NullException(po, "po不能为null");
		Tool.NullException(po.getLogin_name(), "Login_name不能为null");
		int key = Key.getKey(KeyConstant.XT_KEY_SN);
		po.setUser_id(String.valueOf(key));
		if(xt_usersDAO.checkUser(po.getLogin_name())>0){//>0表示当前login_name存在
			Tool.UniqueException("login_name已经存在！");
		}
		po.setUser_code(String.valueOf(-key));
		xt_usersDAO.insert(po);
		//维护人员角色表HIS_EMP_ROLE
		saveHis_emp_role(po);
		
	}
	/**
	 * 维护人员角色表HIS_EMP_ROLE数据，执行先删除在批量插入
	 * 首先校验list,user_id不能为空
	 * 根据role_types取xt_role表数据最终取的ROLE_CODE
	 * 把role_code存在入list<His_emp_role>
	 * 批量插入数据His_emp_role表
	 * @param po
	 * @throws Exception
	 */
	private void saveHis_emp_role(Xt_usersVO po)throws Exception{
		Tool.NullException(po.getList(), "list<Xt_role>不能为null");
		Tool.NullException(po.getUser_id(), "User_id不能为null");
		
		his_emp_roleDAO.deleteByUser_id(po.getUser_id());//先删除
		//查询role_code
		List<Xt_role> role_list =xt_roleDAO.getRoleByRoleType(po.getList());
		Tool.NullException(role_list, "没有找到xt_role.role_code!");
		//把系统角色存入List<His_emp_role>，然后存入数据库
		List<His_emp_role> his_list = new ArrayList<His_emp_role>();
		for(int i=0;i<role_list.size();i++){
			Xt_role role_po =  role_list.get(i);
			His_emp_role role = new His_emp_role();
			role.setRole_code(role_po.getRole_code());
			role.setEmprole_sn(String.valueOf(Key.getKey(KeyConstant.XT_KEY_SN)));
			role.setUser_id(po.getUser_id());
			his_list.add(role);
		}
		//新增
		insertSupport.batchInsert(
				"monster.flight.comm.entity.dao.His_emp_roleDAO.batchInsert", his_list);
	}
	/**
	   * @Description: 修改登录用户数据 old_Login_name 和Login_name必须传入 
	   * @param po 
	   * @throws Exception
	   */
	public void update(Xt_usersVO po) throws Exception {
		Tool.NullException(po, "po不能为null");
		Tool.NullException(po.getLogin_name(), "Login_name不能为null");
		Tool.NullException(po.getOld_login_name(), "old_Login_name不能为null");
		if(!po.getLogin_name().equals(po.getOld_login_name())){////改变了账号，判断是否重复
			if(xt_usersDAO.checkUser(po.getLogin_name())>0){//>0表示当前login_name存在
				Tool.UniqueException("login_name已经存在！");
			}else{
				xt_usersDAO.update(po);
			}			
		}else{
			xt_usersDAO.update(po);
		}
		//维护人员角色表HIS_EMP_ROLE
		saveHis_emp_role(po);
		
	}
	 /**
	   * @Description: 修改登录用户状态
	   * @param user_id,user_state登录状态
	   * @throws Exception
	   */
	public void changeStateByUser_id(Xt_users po) throws Exception {
		Tool.NullException(po.getUser_id(), "user_id不能为null");
		Tool.NullException(po.getUser_state(), "user_state不能为null");
		xt_usersDAO.changeStateByUser_id(po);
	}
	/**
	   * @Description: 删除登录用户
	   * @param user_id
	   * @throws Exception
	   */
	public void delete(String user_id) throws Exception {
		Tool.NullException(user_id, "user_id不能为null");
		his_emp_roleDAO.deleteByUser_id(user_id);//删除子表HIS_EMP_ROLE
		xt_usersDAO.deleteByKey(user_id);
		
	}
	/**
	   * @Description:根据主键得到po
	   * @param user_id
	   * @return
	   * @throws Exception
	   */
	public Xt_usersVO getPoByKey(String user_id) throws Exception {
		Tool.NullException(user_id, "user_id不能为null");		 
		Xt_users xt_users = xt_usersDAO.getByKey(user_id);
		Xt_usersVO vo = new Xt_usersVO();
		vo.setUser_id(xt_users.getUser_id());
		vo.setLogin_name(xt_users.getLogin_name()) ;
		vo.setLogin_psw(xt_users.getLogin_psw()) ;
		vo.setNew_login_pwd(xt_users.getNew_login_name());
		vo.setNew_login_name(xt_users.getNew_login_name());
		vo.setUser_name(xt_users.getUser_name());
		vo.setReal_user_name(xt_users.getReal_user_name());
		vo.setUser_code(xt_users.getUser_code());
		vo.setUser_type_id(xt_users.getUser_type_id());
		vo.setUser_state(xt_users.getUser_state());
		vo.setOld_login_name(xt_users.getOld_login_name());
		if(vo!=null){
			List<His_emp_role> list =  his_emp_roleDAO.getHis_emp_roleByUser_id(user_id);
			System.out.println(list);
			Tool.NullException(list, "没有找的His_emp_role数据,查询His_emp_role时异常");
			List<Xt_role> role_list = new ArrayList<Xt_role>();			
			//把His_emp_role中ROLE_code存入role_list
			for(int i=0;i<list.size();i++){
				Xt_role po = new Xt_role();
				po.setRole_code(list.get(i).getRole_code());
				role_list.add(po);
			}
			//根据role_codes查询xt_role表		
			if(role_list.size()>0)
				vo.setList(xt_roleDAO.getRoleByRoleCode(role_list));			
		}
		return vo;
	}
	/**
	   * @Description:得到总条数分页用
	   * @param po
	   * @return
	   * @throws Exception
	   */
	public int getRowCount(Xt_users po) throws Exception {
		Tool.NullException(po, "po 不能为null");
		int ret = xt_usersDAO.getRowCount(po);
		return ret;
	}
	/**
	   * 判断login_name是否唯一
	   * @param old_login_name
	   * @param login_name
	   * @return true唯一 false不唯一
	   * @throws Exception
	   */
	public boolean vild_LoginNameOnly(String old_login_name, String login_name)
			throws Exception {
		Tool.NullException(login_name, "login_name不能为null");
		boolean ret=false;
		if(!login_name.equals(old_login_name)){//old_login_name 和login_name不一致在进行校验
			int i=xt_usersDAO.checkUser(login_name);
			ret=i>0?false:true;
		}else{//如果old_login_name==login_name
			ret=true;
		}
		return ret;
	}
	
}
